home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-11-05 | 101.5 KB | 1,703 lines |
-
-
-
-
-
-
- ======================================================
- | |
- | Programmierung von Modulen für GEM-View 3.00 |
- | ---------------------- |
- | GEM-View ist SHAREWARE |
- | ---------------------- |
- | |
- | © 1990/91/92/93 by |
- | |
- | Dieter Fiebelkorn |
- | Grüner Weg 29a |
- | 45768 Marl-Brassert |
- | (Germany) |
- | |
- ======================================================
-
-
-
-
-
- !!!!! BITTE LESEN SIE AUCH DIE DATEIEN "CHANGES" UND "GEMVIEW3.TXT" !!!!!
-
-
-
- Inhaltsübersicht: (Lesen Sie auch "CHANGES")
- ============================================
- - Modularisierung
- - Allgemeines
- - Lademodule
- - GDPS Treiber
- - Speichermodule
- - Druckmodule
- - Bearbeitungsmodule
- - Das Konvertierungsmodul
- - "EXTOBFIX.PRG" von Interface
- - Abschließende Worte
- - Parameterübergabe und allgemeine Strukturen
- - Parameterübergabe
- - IMAGE-Struktur
- - IMAGEOPTIONS-Struktur
- - LOAD-Struktur
- - SAVE-Struktur
- - PRINT-Struktur
- - PROC-Struktur
- - CONV-Struktur
- - Entwickler-Support
-
-
-
-
-
-
- Neue Modularisierung:
- """""""""""""""""""""
-
- Allgemeines:
- ¯¯¯¯¯¯¯¯¯¯¯¯
- Die externen Module haben die Endungen: GVL, GVS, GVP und GVR (jeweils
- für Load, Save, Print unf pRocess) und werden in einem einstellbaren
- Modulverzeichnis ("Install path ... ^Z") in den Unterordern GVWLOAD,
- GVWSAVE, GVWPRINT und GVWMODUL gesucht! Von diesem Modulen darf es
- beliebig viele geben; Hauptsache es ist genug Speicher vorhanden um die
- allgemeinen Verwaltungsinformationen zu allen Modulen anzulegen. Aber
- wenn das nicht klappt, dann sollten Sie besser keine Bilder mehr laden,
- dafür reicht der Speicher dann mit Sicherheit nicht mehr! Allerdings
- bleibt GEM-View mit seinen internen Modulen (GEM-XIMG, GEM-Metafile, Text,
- Resourcen und Hexdump fürs Laden, sowie GEM-XIMG fürs Speichern) funktions-
- tüchtig!
-
- Auch wenn "verbose" eingeschaltet ist sollte nicht mehr als notwendig
- "gelabert" werden. Eine einzeilige Information über die Aktion ist
- vollkommen ausreichend. Wenn jemand sein Copyright unbedingt einbringen
- muß, dann ist die Meldung auf eine Zeile zu beschränken und darf nur
- bei dem Speicher-, Druck- und Bearbeitungsmodulen eingebaut werden.
- Bei den Lademodulen ist es nur störend und wird ohne meine Zustimmung
- nicht geduldet. Im äußersten Fall ;-{ kann ich mich dazu durchringen
- es bei einem komplexen Modul NACH der Identifizierung des Bildes zu
- erlauben!
-
- Für das Copyright ist der Modulheader und die Infofunktion in den
- "Load type"-, Speicher-, Druck- und Bearbeitungs-Dialogen geschaffen
- worden!
- Da Beispiele meist mehr sagen als viele Worte, liegen eine Reihe von
- Sourcen für die einzelnen Modulen dem Paket bei! Allerdings finden
- sich hier doch einige Anmerkungen und Hinweise, die in den Sourcen
- und in der Beschreibung der Strukturen nicht so offensichtlich zu
- Tage treten.
-
-
-
- Lademodule:
- ¯¯¯¯¯¯¯¯¯¯¯
- Folgende Bildtypen dürfen von dem Ladetreiber geliefert werden:
- - Mono : IATARIMONO, IBITMAP
- - Color : IATARI_RGB, IRGB
- - True-Color: IATARI__TC, ITRUEC
-
- Die Aufrufstruktur des Lademoduls zeigt sich an dem folgenden Prototyp
- der Funktion, zu beachten ist nur, daß der Zeiger auf die Struktur
- "LOAD_Structure" im Register A0 und der weitere Parameter "verbose"
- im Register D0 übergeben wird:
-
- Image *gvw_loader(LOAD_Structure* ls, int verbose);
-
- Der Zeiger auf die "Image"-Struktur wird ebenfalls im Register A0
- zurückgegeben. Neben dem Zeiger auf die Struktur sind zwei Sonder-
- fälle möglich:
- "NULL" oder "0L" im Register A0 bedeutet, daß kein Bild identifiziert
- oder geladen wurde!
- "(Image* -1L)" im Register A0 bedeutet, daß das Bild zwar eindeutig
- identifiziert werden konnte, aber es war aber nicht
- möglich es zu laden (Speicherplatzmangel, defekte
- Bilddaten, ...)Alle anderen Werte werden als Zeiger auf eine "Image"-Struktur ver-
- wendet. Also, hier ist Gewissenhaftigkeit angesagt!
-
- Lademodule müssen, wenn Sie automatisch von GEM-View aufgerufen werden
- zuerst versuchen das Format des Bildes zu identifizieren, d.h. prüfen,
- ob das angegebene File eindeutige Merkmale des Formates besitzt, das
- dieses Modul repräsentiert. Ein automatischer Aufruf kann von dem
- benutzer-gewählten Aufruf durch das Flag "ls->user_identified" unter-
- schieden werden. Soll das Format nur identifiziert, aber nicht geladen,
- werden, so ist das Flag "ls->only_identified" gesetzt. In diesem Fall
- wird, wie beim Laden, eine Meldung über das Bild ausgegeben, wenn das
- Bild identifiziert werden konnte und ein Wert ungleich NULL ((void*)0L)
- in A0 zurückgegeben. Konnte das Bild nicht identifiziert werden, so
- wird als Funktionswert NULL ((void*)0L) in A0 zurückgegeben.
-
- Bei den Lademodulen kann über "Schalter" (Flags) die Verwaltung und
- Verwendung der Module gesteuert werden. Weiterhin existiert ein Flag,
- welches nur vom Programmierer des Moduls eingestellt werden kann:
- Das "File-Selector"-Flag.
-
- Der Schalter "Res." (Resistent) bewirkt im eingeschalteten Zustand, daß
- dieses Modul dauerhaft, d.h. während der Laufzeit von GEM-View, im
- Hauptspeicher gehalten wird. Ist dieser Schalter im Modul eingeschaltet,
- wenn GEM-View gestartet wird, so wird das Modul während des "Scan" oder
- Absuchvorganges geladen und im Speicher verwaltet. Wird der Schalter
- erst nach dem Start von GEM-View aktiviert, so wird das Modul resistent
- nachdem es einmalig zur Analyse des Bildformates in den Speicher ge-
- laden worden ist.
-
- Der Schalter "Auto" (Automatischer Aufruf) wird dazu verwendet GEM-View
- mitzuteilen, ob dieses Modul zur Identifizierung des Bildformates ein-
- gesetzt werden soll. Eingeschaltet wird das Modul geladen und mit den
- dort vorhandenen Prüfmechanismen versucht das Bild zu analysieren, wird
- es erkannt, so wird es mit diesem Modul auch sofort geladen. Ist der
- Schalter nicht aktiviert, so wird das Modul einfach übersprungen, aller-
- dings können Sie es über "Load type" immer noch direkt auswählen!
-
- Das "File-Selector"-Flag gibt an, ob eine File-Selector-Box zur
- Auswahl eines Bildes geöffnet werden soll in der Regel ist dies
- der Fall, wenn allerdings das Bild nicht einer Datei, sondern einem
- externen Gerät entnommen wird (z.B. Scanner) so ist die File-Selector-
- Box überflüssig und kann deaktiviert werden. Dies bietet sich gerade
- im Zusammenhang mit dem "Auto"-Flag an um beispielweise einen GDPS-
- Treiber für GEM-View zu realisieren.
-
- Nebenbei empfehle ich zur Sicherheit, das Module, die externe Geräte
- ansprechen oder vor der Analyse des Bildes einen Benutzerdialog führen
- müssen in der Struktur "LOAD_Structure" das Flag "ls->user_identified"
- überprüft wird. Ist es gelöscht handelt es sich um einen automatischen
- Aufruf von GEM-View, so das häufig ein sofortiges Verlassen des Moduls
- sinnvoll sein dürfte. Ist das "ls->user_identified"-Flag hingegen ge-
- setzt kann das sich Modul voll ins Zeug legen, weil ... der Benutzer
- will es ja nicht besser! ;-/
-
- GDPS Treiber:
- ¯¯¯¯¯¯¯¯¯¯¯¯¯
- Dieser Abschnitt ist dazu da um Neugierig zu machen in den letzten
- Absätzen sollte klar geworden sein, das ein GDPS-Treiber einfach an
- GEM-View anzubinden sein sollte, wenn mal die GDPS-Schnittstellen-
- Beschreibung vorliegt. Am besten ist aber ein Programmierer, der
- sich schonmal damit rumgeschlagen hat macht sich daran zu schaffen.
- Ich kann es nicht selber machen, da mir Beschreibung, Geräte zum
- testen und inzwischen auch die Zeit fehlt. Tja, ;-(
-
-
-
- Speichermodule:
- ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
- Folgende Bildtypen können dem Speichermodul übergeben werden:
- - Mono : IATARIMONO, IBITMAP
- - Color : IATARI_RGB, IRGB
- - True-Color: IATARI__TC, ITRUEC
-
- Die Aufrufstruktur des Lademoduls zeigt sich an dem folgenden Prototyp
- der Funktion, zu beachten ist nur, daß der Zeiger auf die Struktur
- "LOAD_Structure" im Register A0 und der weitere Parameter "verbose"
- im Register D0 übergeben wird:
-
- int gvw_saver (SAVE_Structure* ss, int verbose);
- Der Rückgabewert der Funktion, der angibt ob die Funktion korrekt
- ihren Dienst verrichtet hat wird im Register D0 erwartet.
-
-
-
- Druckmodule:
- ¯¯¯¯¯¯¯¯¯¯¯¯
- Folgende Bildtypen können dem Druckmodul übergeben werden:
- - Mono : IATARIMONO
- - Color : IATARI_RGB
- - True-Color: IATARI__TC
-
- Die Aufrufstruktur des Lademoduls zeigt sich an dem folgenden Prototyp
- der Funktion, zu beachten ist nur, daß der Zeiger auf die Struktur
- "LOAD_Structure" im Register A0 und der weitere Parameter "verbose"
- im Register D0 übergeben wird:
-
- int gvw_print (PRINT_Structure* ps, int verbose);
- Der Rückgabewert der Funktion, der angibt ob die Funktion korrekt
- ihren Dienst verrichtet hat wird im Register D0 erwartet.
-
-
-
- Bearbeitungsmodule:
- ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
- Folgende Bildtypen können dem Bearbeitungsmodul übergeben werden:
- - Mono : IATARIMONO
- - Color : IATARI_RGB
- - True-Color: IATARI__TC
-
- Die Aufrufstruktur des Lademoduls zeigt sich an dem folgenden Prototyp
- der Funktion, zu beachten ist nur, daß der Zeiger auf die Struktur
- "LOAD_Structure" im Register A0 und der weitere Parameter "verbose"
- im Register D0 übergeben wird:
-
- Image *gvw_proc (PROC_Structure* rs, int verbose);
- Der Zeiger auf die "Image"-Struktur wird ebenfalls im Register A0
- zurückgegeben. Neben dem Zeiger auf die Struktur ist ein Sonder-
- fall möglich:
- "NULL" oder "0L" im Register A0 bedeutet, das die Operation nicht
- durchgeführt werden konnte. Der Grund sollte dem
- Benutzer durch eine Zeile im Protokoll-Fenster
- angezeigt werden. Alternativ kann in diesem Fall
- auch der Zeiger auf das "Input"-Bild "rs->image"
- zurückgegeben werden, es hat den gleichen Nährwert!
-
- Das Bild, welches dem Bearbeitungsmodul übergeben wird von GEM-View aus dem
- Speicher entfernt und darf nicht vom Modul gelöscht werden.
-
-
-
- Das Konvertierungsmodul:
- ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
- Eine neue Funktion im Modul GEMVIEW.GVC wird durch "Convert ..." im Deskmenü aufgerufen, wenn das Modul gefunden wird. Sie liefert eine
- Kette von ImageOptions-Strukturen zurück, die dann von GEM-View ab-
- gearbeitet wird. Der Zeiger auf die Struktur "CONV_Structure" wird
- im Register A0 übergeben.
- ImageOptions *gvw_proc (CONV_Structure* cs);
-
- Der Zeiger auf die "ImageOptions"-Struktur wird ebenfalls im Register
- A0 erwartet. Neben dem Zeiger auf die Struktur ist ein Sonderfall
- möglich:
- "NULL" oder "0L" Nichts zu Konvertieren! (*Puh*) Nochmal an der an-
- strengenden Arbeit vorbei gekommen.
-
- Die Hauptfunktion des Moduls "CONVERT", das auch als Quelltext vorliegt,
- hilft sicherlich beim Entwerfen eines neuen Konvertierungsmodule, welches
- nur noch die Strukturen zusammenstellen muß. GEM-View übernimmt ja die
- eigentliche Arbeit. Schauen Sie sich also mal ein wenig in der Funktion
- "gvw_convert" aus dem "CONVERT"-Modul um.
- Die anderen Funktionen im Modul "CONVERT" sind "schmückendes" Beiwerk und
- für die die Gesamtfunktionsweise von untergeordneter Bedeutung.
-
-
-
- "EXTOBFIX.PRG" von Interface
- ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
-
- Die Idee, für die Anzeige von erweiterten Resourcen, externe Module zu
- verwenden geht leider mal nicht auf mich zurück. Vielmehr hat Georg Krämer
- diesem Vorschlag Anfang Oktober gemacht, den ich gerne aufgegriffen habe,
- weil Olaf Meisiek (Autor von Interface) die meiste Arbeit mit seiner
- Definition und der Realisierng von "EXTOBFIX.PRG" schon geleistet hatte.
- Wäre ich nicht so blöd gewesen, hätte die Einbindung auch wesentlich
- schneller und unproblematischer ablaufen können. Na ja, reden wir besser
- nicht darüber.
- Also langer Rede kurzer Sinn, wenn Sie ihr persönliches "EXTOBFIX.PRG" in
- den Modulordner kopieren dann werden die Resourcen nun in voller Pracht
- und Schönheit angezeigt. Für alle Wissensdurstigen sei gesagt: GEM-View
- verwendet ausschließlich die "fix_objs"-Routine aus dem Zeigerarray und
- legt wie Interface Kopien der aller OBJECT-Strukturen an (Edit-Objekte
- gibt es in GEM-View nicht ;-). Für weitere Informationen schlagen Sie
- bitte im Interface-Handbuch unter "Programmierung eines EXTOBFIX-Programmes"
- nach (bei mir ist es Kapitel 7, Seite 63).
-
-
-
- Abschließende Worte:
- ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
- Speichermodule schreiben ihre Ausgaben in eine Datei, eine Umlenkung
- auf den Drucker wird nicht speziell unterstützt, dafür ist es aber
- möglich sowohl Farbbilder, als auch TrueColor-Bilder in einer mono-
- chromen Bildschirmauflösung zu erhalten.
- Die Druckmodule geben in der Regel die Daten direkt auf den Drucker
- aus. Hierfür stehen "PRN:" für die parallele Schnittstelle und "AUX:"
- für die serielle Schnittstelle zur Verfügung. Eine Ausgabe in eine
- Datei kann ohne weiteres durch die Angabe eines absoluten Pfades
- erfolgen. Allerdings kann NUR das angezeigte Bild gedruckt werden.
-
- Abfragen über Alert-Boxen oder mit Hilfe von Dialogen oder die Ver-
- wendung der File-Selector-Box sind zulässig. Als Beispiel sei angeführt:
- - JPEG Speichermodul (ist mir von Guido Vollbeding zugesichert worden!):
- Kann mit einem Dialog die Qualität der Ausgabe einstellen.
- - PostScript Druckmodul (wird von Björn Tiemann (Schweiz) erstellt):
- Kann mit einer Alert-Box abfragen, ob auf der paralellen, der seriellen
- Schnittstelle oder in ein File "gedruckt" werden soll. Die File-Selector-
- Box wird zur Auswahl der Zieldatei aufgerufen.
- Ich möchte allerdings darauf hinweisen, daß ein Modul seinem spezifischen
- Zweck nachkommen soll und nicht mehrere unterschiedliche Funktionen bereit-
- stellt. Es wird nur unübersichtlich, wenn das Speichermodul mit dem Drucker
- musiziert und vielleicht dann irgendwann ein Druckmodul versucht ein neues
- Bild zu Laden. Vieles ist möglich, aber nicht alles ist sinnvoll.
- Achtet also auf eine saubere Trennung der Module! DANKE!
-
- Soll ein Modul erstellt werden, das in einer beliebigen Bildschirmauflösung,
- in der Lage sein soll, einen beliebigen Bildtyp wieder in voller Farbtiefe
- abzulegen, so sollte es konsequenterweise als Speichermodul ausgelegt
- werden. Im Beispiel einer PostScript Ausgabe sollte ein Modul für die
- Speicherung zuständig sein (dies verarbeitet alle möglichen Bildtypen,
- unabhängig von der Bildschirmauflösung). Ein weiteres Modul ist für den
- Druck zuständig und erhält ausschließlich angezeigte Bilder.
-
- Die GEM-View Module dürfen "fast" alles, was ein GEM-Programm darf.
- Nicht erlaubt ist die Verwendung der Funktionen appl_init() und appl_exit()!
- Alles was nach Ende des Moduls nicht mehr erreichbar muß vor Ende des Moduls
- wieder entfernt werden. Zum Beispiel:
- - VDI-Workstation (auch virtuelle) müssen vor Beendigung des Moduls
- geschlossen werden.
- - Fenster die erzeugt und geöffnet wurden müssen wieder geschlossen und
- gelöscht werden.
- - Zu jedem wind_update(BEG_UPDATE/BEG_MCTRL) muß ein wind_update(END_UPDATE/
- END_MCTRL) vorhanden sein.
- - ... (was sonst noch anfällt) ...
- CONVERT.C zeigt schon ein bissel (bischen) davon, was gemacht werden darf!
-
- Nach einer Richtlinie von ATARI müssen Dialog durch wind_update(BEG_UPDATE/
- BEG_MCTRL) und wind_update(END_UPDATE/END_MCTRL) umschlossen werden, da es
- sonst zum "übermalen" des Dialoges durch den Desktop kommt (AES 3.x, 4.x)!
- CONVERT.C berücksichtigt diese Richtlinie!
-
-
-
-
-
- Parameterübergabe und allgemeine Strukturen:
- """"""""""""""""""""""""""""""""""""""""""""
-
- Parameterübergabe
- ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
- Für die Parameterübergabe gelten die Regeln von Turbo C / Pure C:
- Parameterübergabe Pure C (Auszug aus der Online Hilfe von PureC)
- ======================================================================
- - Die ersten drei Variablen vom Typ char, int oder long werden in den
- Registern D0, D1, D2 übergeben.
- - Die ersten zwei Adressparameter (Pointer) werden in den Registern A0 und
- A1 übergeben.
- - Weitere Parameter, die keinen Platz mehr in den Registern D0, D1, D2, A0
- A1 finden werden über den Stack übergeben.
- - Parameter werden in der Reihenfolge von rechts nach links übergeben.
-
- Beispiel:
- ---------
- extern void lbf(int x1, int y1, int x2, int y2, int *l, int *b, int *f);
- main()
- {
- int x1 = 10, y1 = 10, x2 = 20, y2 = 20, l, b, f;
- lbf(x1, y1, x2, y2, &l, &b, &f);
- }
- Da mehr Werte-, als auch Adress-Parameter an die Funktion "lbf" übergeben
- werden, als Register zur Verfügung stehen, benötigen wir also in jedem Fall
- den Stack. Der vierte Werte-Parameter muß auf dem Stack abgelegt werden.
- Ebenso findet der dritte Adress-Parameter keinen Platz in den Registern,
- so daß auch dieser auf dem Stack abgelegt werden muß.
-
- In den Registern befinden sich: D0: x1 (Wert von x1)
- D1: y1 (Wert von y1)
- D2: x2 (Wert von x2)
- A0: &l (Adresse der Variablen l)
- A1: &b (Adresse der Variablen b)
- Auf dem Stack befinden sich: &f (hi) (höchstwertiges Wort im Stack)
- &f (lo)
- y2 (Wert von y2)
- Return- (Rücksprungadresse)
- Adresse (Stackpointer zeigt hierauf)
-
- Der Adress-Parameter f wird nach der Regel "von-rechts-nach-links" zuerst
- auf den Stack gelegt. Danach kommt der Wert von y2 auf den Stack. Bitte
- beachten Sie, daß die Rücksprungadresse des Unterprogrammes als letzter
- "Parameter" auf den Stack gelegt wird, so daß die Parameter im Stack ab dem
- Offset 4 anfangen. y2 (Offset 4), &f (Offset 6)!
-
- Übergabe von float und double Parametern (Wird hier nicht verwendet!)
- ---------------------------------------------------------------------
- - Variablen vom Typ "float" und "double" werden grundsätzlich auf dem
- Stack übergeben.
- - Jede Funktion die eine andere Funktion mit Rückgabewert vom Typ "double"
- oder "float" aufruft, reserviert als Erstes eine lokale "double"-Variable
- (d.h. 10 Byte) auf dem Stack zur Aufnahme des Rückgabewertes.
- - Der Rückgabewert hat intern immer den Typ "double", auch wenn er als
- "float" deklariert wurde. In diesem Fall wird er nach der Rückkehr in
- einen "float" konvertiert.
-
- Allgemeines
- -----------
- Obiges gilt sinngemäß auch für Funktionen, die Strukturen zurückliefern,
- nur werden nicht 10 Bytes auf dem Stack reserviert, sondern genügend
- Speicher, um die ganze Struktur aufzunehmem.
-
- In C räumt die aufrufende Funktion nach dem Aufruf die Parameter selbst
- vom Stack (z.B. mit ADDQ.W #8,A7", nach einem Aufruf mit zwei Adresspara-
- metern). Dies erübrigt sich natürlich, wenn alle Parameter in Registern
- übergeben wurden.
- ======================================================================
-
-
-
-
-
- IMAGE-Struktur (Zur Aufnahme und die Definition der Bilder)
- ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
- Hier ist die "Image"-Struktur, mit den Hilfsstrukturen aufgeführt und
- kurz erläutert.
-
- typedef struct rgbmap {
- unsigned int size; /* Größe der Farbpalette in red, green und blue,
- muß unbedingt eine Zweierpotenz (2^n) sein */
- unsigned int used; /* Anzahl der verwendeten Farben in Palette */
- unsigned char compressed; /* (interne Verwendung) wird auf 0 gesetzt */
- unsigned char reserved; /* (reserviert) für künftige Erweiterung */
- unsigned int unused16; /* (interne Verwendung) wird auf 0 gesetzt */
- Intensity *red; /* Farbwerte für Rot: Wertebereich [0..65535] */
- Intensity *green; /* entsprechende Grün-Farbwerte von 0 bis used*/
- Intensity *blue; /* dazu passende Farbwerte in Blau. Sum:Farbe */
- } RGBMap;
-
-
- typedef struct Scaling {
- unsigned count : 4; /* ScaleDialog/Punkte: 1(a), 2(a,b), 3(a,b,c) */
- unsigned a : 4; /* Wertebereich: 1 (unterste Position) */
- unsigned b : 4; /* 4 (mittlere Position,default)*/
- unsigned c : 4; /* 7 (oberste Position) */
- } Scaling;
-
-
- typedef struct Image {
- char *title; /* Pfadname, z.B. durch new...Image() gesetzt */
- unsigned short type; /* Typ des Bildes, durch new...Image() gesetzt
- IBITMAP 0x11: Bild ist eine Bitplane
- IATARIMONO 0x11: Bild ist Atari Mono Bitplane
- IATARI_RGB 0x12: Bild ist AtariColor Bitmap
- IATARI__TC 0x13: Bild ist Atari TrueColor
- ITRUEC 0x13: Bild ist TrueColor Bild
- IRGB 0x14: Bild ist RGB-Paletten Bild */
- unsigned short width; /* LOAD: sichtbare Breite des Bildes in Punkten
- Nach dem Alignment (für SAVE, PRINT, PROC):
- Gespeicherte Breite des Bildes in "data" */
- unsigned short height; /* Höhe des Bildes in Punkten */
- unsigned short depth; /* Tiefe des Bildes, B/H/T gesetzt durch ... */
- unsigned short unalignwidth;/* (intern) sichbare Breite nach Alignment
- /* LOAD: nicht verwendet, auf 0 gesetzt.
- /* SAVE, PRINT, PROC: diese Breite beachten! */
- RGBMap rgb; /* Farbpalette des Bildes, Struktur siehe oben*/
- byte *data; /* Bilddaten, gerundet nach den Angaben aus:
- - "width" und "alignTo8" (bei LOAD)
- - "width" (bei SAVE, PRINT, PROC, auf Worte)
- wird durch Alignment auf Worte gerundet */
- unsigned int pixlen; /* Zahl der Bytes/Pixel: Mono/Color:1 ; TC:3 */
- Scaling scalered; /* (intern) Scale-Beschreibung für Rot */
- Scaling scalegreen; /* (intern) Scale-Beschreibung für Grün */
- Scaling scaleblue; /* (intern) Scale-Beschreibung für Blau */
- Scaling scaleadjust; /* (intern) Scale-Beschreibung f. Grauwandlung*/
- unsigned alignTo8 :2; /* 1: Bild ist schon auf Bytes aligned;
- sollte in bei MONOs gesetzt werden
- 2: Bild steht schon Worte aligned in data */
- unsigned fastload :1; /* (internal) */
- unsigned loadgdosfonts:1; /* (internal) */
- unsigned scaleused :1; /* (internal) */
- unsigned unused :3; /* (internal) */
- unsigned font_point :8; /* (internal) */
- } Image;
-
-
- Folgende Bildtypen sind zulässig:
-
- - Mono
- - IATARIMONO, IBITMAP
- In diesen Bildtypen wird eine Bitplane in "image->data" abgelegt. Ein
- gesetztes Bit ist schwarz ein gelöschtes Bit ist weiß. Die Definition
- entspricht einer GEM-Mono-Standard-Bitmap. Im Fall eines "IATARIMONO"-
- Bildes sind die Daten auf 16 Bit (Worte) begradigt. Bei Bildern vom
- Typ "IBITMAP" sind die Daten in der Regel byteweise ausgrichtet.
-
- - Color
- - IATARI_RGB
- In "image->data" befindet sich eine GEM-Color-Standard-Bitmap, d.h. es
- sind genau "image->depth" viele monochrome Bitplanes mit der folgenden
- Größe hintereinander angeordnet: "image->width * image->height / 8".
- Beachten Sie, daß "image->width" auf 16 begradigt ist und die Rechnung
- in LONG durchgeführt werden sollte.
- Die Reihenfolge der Farben ergibt sich aus der Kodierung der Pixel,
- wobei die erste Plane das niederwertigste Bit repräsentiert.
- Die Daten von Bilder des "IATARI_RGB"-Typs sind immer auf 16 Bit (Worte)
- ausgerichtet! Beispiel: Ein Bild mit 3 Planes!
- Plane 1: %01010101 ........
- Plane 2: %00110011 ........
- Plane 3: %00001111 ........
- image->rgb.size = 8; image->used = 8
- image->rgb.red : 0xFFFF 0xFFFF 0x0000 0x0000 0xFFFF 0xFFFF 0x0000 0x0000
- image->rgb.green: 0xFFFF 0x0000 0xFFFF 0x0000 0xFFFF 0x0000 0xFFFF 0x0000
- image->rgb.blue : 0xFFFF 0x0000 0x0000 0xFFFF 0x0000 0xFFFF 0xFFFF 0x0000
- Die Punkte habe von links nach rechts folgende Kodierungen und Farben:
- 0(weiß), 1(rot), 2(grün), 3(blau), 4(gelb), 5(magenta), 6(cyan), 7(schwarz)
- - IRGB
- Das "IRGB"-Bildformat verwendet je ein Byte pro Bildpunkt und speichert
- dort direkt den Index auf die Farbpalette ab. Dabei wird unabhängig von
- der Bildtiefe immer ein volles Byte verwendet. Das heißt, daß bei 16
- Farben (Bildtiefe: 4) die obersten 4 Bit immer 0 sind!
- Beispiel: wie oben!
- "->data": 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
- Die Kodierungen und die Farben entsprechen von links nach recht denen
- des obigen Beispiels.
-
- - True-Color
- - IATARI__TC, ITRUEC
- Vom Speicherumfang das größte Format. Hier werden pro Bildpunkt drei
- hintereinanderliegende/unmittelbar-aufeinander-folgende Bytes verwendet,
- dabei wird jeder Farbanteil (Rot, Grün, Blau) jeweils durch ein Byte
- repräsentiert. Jeder Farbanteil hat somit einen Wertebereich von 0 bis
- 255, was genau dem True Color Format mit 16777216 Farben entspricht.
- Die Reihenfolge der Farbanteile ist: Rot, Grün, Blau!
- Im Fall eines "IATARI__TC"-Bildes sind die Daten auf 16 PIXEL ausge-
- richtet. ACHTUNG: PIXEL = 3 Byte!
-
-
-
-
-
- IMAGEOPTIONS-Struktur (zur Vorbereitung der automatischen Konvertierung)
- ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
- Die "ImageOptions"-Struktur wird ausschließlich von dem externen
- Konvertierungsmodul "GEMVIEW.GVC" verwendet.
-
- typedef struct {
- unsigned tocolors :16; /* # der Farben, Wertebereich [4 .. 256] */
- unsigned process : 4; /* Typ des Bearbeitungsalgorithmus:
- PROC_ORDER 0: Order-Dither Verfahren
- PROC_NEAR 1: Benachtbarte Farbe
- PROC_FLOYD 2: --"-- mit Fehlerfort.
- PROC_JJN 3: --"-- mit Fehlerfort.
- PROC_STUCKI 4: --"-- mit Fehlerfort.*/
- unsigned colormap : 4; /* Typ der Farbpaletten-Berechnung:
- CMAP_FIX 0: Feste Farbpalette
- CMAP_USERDEF1 1: Aus oberstem Fenster
- CMAP_USERDEF2 2: Standardpalette
- CMAP_OCTREEA 3: OcTree/Appromimativ
- CMAP_OCTREE 4: OcTree/Alle Punkte
- CMAP_STATA 5: Varianz/Appromimativ
- CMAP_STAT 6: Varianz/Alle Punkte */
- unsigned spec_active : 1; /* aktiviert die eingestellten Werte */
- unsigned spec_always : 1; /* immer durchführen (also if no need) */
- unsigned spec_grey : 1; /* Dithering auf Grauwert-Palette */
- unsigned spec_noise : 1; /* Verwende "noise reduction"-Filter */
- unsigned spec_compress : 1; /* Verdichte Palatte auf benutzte Farben */
- unsigned unused : 3; /* (reserviert) für künftige Erweiterung */
- } ColorDither;
-
-
- typedef struct _ios{
- char *name; /* Pfadname des zu ladenden Bildes */
- int merged; /* mit dem vorherigen Bild verschmelzen ?(0/1)*/
- int atx, aty; /* Pos. an der das Bild einzufügen ist (merge)*/
- unsigned int bright; /* Aufhellugsfaktor in Prozent, 100=0 default */
- unsigned int clipx, clipy; /* Obere linke Ecke des zu verwendenden Bildes*/
- unsigned int clipw, cliph; /* Ausdehnung des Zielbildes (Breite/Höhe) */
- unsigned int last_clipx; /* (interne Verwendung) wird auf 0 gesetzt */
- unsigned int last_clipy; /* (interne Verwendung) wird auf 0 gesetzt */
- unsigned int last_clipw; /* (interne Verwendung) wird auf 0 gesetzt */
- unsigned int last_cliph; /* (interne Verwendung) wird auf 0 gesetzt */
- unsigned int dither; /* Verfahren fürs s/w-Dither:
- "Ausgeschltet" 0: Keine s/w Reduzierung
- FS_Dither 1: "Floyd-Steinberg"-Verfahren
- JJN_Dither 2: "Jarvis-Judice-Ninke" Algo
- Stk_Dither 3: "Stucki"-Ditherverfahren
- Halftone 4: Halbton mit 4x4-Raster
- Ordereddither 5: Order-Dither (nachladbar) */
- unsigned int colors; /* # Farben, fürs Zielbild (Farbvermelzung!) */
- int rotate; /* # Grad zu rotieren, muß Mehrfaches von 90 */
- int xzoom, yzoom; /* Vergrößerungsfaktor in Promille (1 zu 1000)
- Positiv: Relativer Faktor in Promille
- Negativ: Absolute Größe des Zielbildes */
- int align; /* (intern) für dem ATARI immer auf 16 gesetzt*/
- int save; /* Speichere das Bild als:
- 1: Monochromes Bild; dither Bild wenn nötig
- 2: Farbbild; Farbquantisierung falls nötig
- 3: True-Color-Bild */
- char *savename; /* Pfadname des Zielbildes; Name zum speichern*/
- int autoname; /* (interne Verwendung) auf 0 gesetzt */
- unsigned int full, /* Fülle Bild durch Vergrößern/Weiterholung */
- FULL_NO 0: Normal/Default
- FULL_ZOOM 1: Füllen durch Vergrößern
- FULL_REPEAT 2: Füllen durch Weiterholung */
- fullw, fullh; /* Ausdehnung (Breite/Höhe) des "Full"-Bildes */
- ColorDither colordither; /* siehe Beschreibung der Struktur oben */
- Scaling scalered; /* siehe Beschreibung in IMAGE.H */
- Scaling scalegreen;
- Scaling scaleblue;
- Scaling scaleadjust;
- int load_hexdump; /* Lade Datei immer als Text/Hexdump */
- struct _ios *prev, *next; /* doppelt verkettete Liste diese Struktur */
- char tc_saver [14]; /* Modulname ohne Pfad zum speichern (TC) */
- char color_saver[14]; /* Modulname ohne Pfad zum speichern (col.)*/
- char mono_saver [14]; /* Modulname ohne Pfad zum speichern (mono)*/
- } ImageOptions;
-
-
-
-
-
- LOAD-Struktur (für die externen Lade-Module von GEM-View3 *.GVL)
- ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
- Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
- Sie beim Aufruf der Funktionen bitte den Parameterübergabemechanismus von
- Turbo C / Pure C.
-
- typedef struct LOAD_Structure {
- long identify; /* GVWL_module == 'GVWL' */
- int version; /* GVWL_Version == 0x0100 */
- char *in_filename; /* Pfadname der Datei, die geladen werden soll*/
- int screen_depth; /* Tiefe (Zahl Planes) der aktuellen Auflösung*/
- int identify_only; /* Gesetzt: Nur Identifizieren/Mitteilung */
- int user_identified; /* Gelöscht: Automatischer Aufruf von GEM-View
- Gesetzt : Vom Benutzer ausgewähltes Format */
- struct {
- ZFILE *(*open) (char *name, int attrib);
- /* Öffnet virtuell die angegebene Datei, der
- Wert von "attrib" ist auf 0 zu setzen.
- Die Rückgabe ist ein Zeiger auf eine interne
- Struktur, die mit FILE* vergleichbar ist.
- Hinter dieser und den folgenden Funktionen
- verbirgt sich eine effektive Pufferverwal-
- tung. Nur beim ersten Aufruf wird die Datei
- physikalisch geöffnet. Ein weiterer Aufruf
- setzt nur einige Marke zurück, wenn beim
- Lesen die Puffergrenze (Default: 8kB, in
- GEMVIEW.INF änderbar) nicht überschritten
- wird. Verwendet werden GEMDOS-Funktionen */
- ulong (*read) (ZFILE *zf, void *buf, ulong len);
- /* Ließt aus der geöffneten Datei, die durch
- "zf" identifiziert wird, "len" viele Bytes
- in den Buffer "buf". Die Funktion liefert
- als Ergebnis die Zahl der gelesenen Zeichen*/
- int (*getchr) (ZFILE *zf);
- /* Ließt ein Byte aus und gibt es als Wert
- zurück. Im Fehlerfall wird "errno" auf
- -1 gesetzt und EOF zurückgegeben. */
- char *(*gets) (void *buf, ulong len, ZFILE *zf);
- /* Ließt eine String bis zum ersten Auftreten
- von '\n', dem Dateiende ein oder wenn "le"
- viele Zeichen eingelesen wurde. Rückgabewert
- ist ein Zeiger auf den Buffer oder NULL,
- wenn kein Zeichen eingelesen wurde. */
- ulong (*skip) (ZFILE *zf, ulong len);
- /* Überspringt "len" viele Bytes. Die Funktion
- liefert die neue Dateiposition als Ergebnis*/
- ulong (*seek) (ZFILE *zf, int seekmode, ulong offset);
- /* Postitioniert die Schreibmarke neu. Mit
- SEEK_SET (0) wird auf die absolute Position
- "offset" positioniert. Bei SEEK_CUR (1) wird
- die Position um "offset" Byte weitergesetzt.
- SEEK_END (2) positioniert relativ vom Datei-
- ende in Richtung Anfang der Datei.
- Die Funktion liefert die neue Dateiposition
- als Ergebnis */
- ulong (*tell) (ZFILE *zf);
- /* Liefert als Wert die Länge der Datei. */
- int (*eof) (ZFILE *zf);
- /* Prüft die aktuelle Dateiposition darauf hin
- ob das Dateiende überschritten wurde. Wert
- 0 zeigt einen Aufruffehler an. 1 weißt auf
- Dateiende hin. Ansonsten wird -1 geliefert.*/
- void (*close) (ZFILE *zf);
- /* Schließt die Datei virtuell. Die Datei wird
- automatisch physikalisch geschlossen, wenn
- eine Datei als Bild identifiziert und ge-
- laden oder die Aktion abgebrochen wurde. */
- } input;
- struct {
- int (*printout) (const char* format, ...);
- /* Schreibt eine Meldung in das Protokollfenster
- von GEM-View. Die Aufrufstruktur und die
- Parameter entsprechen "printf()" aus der
- C-Standard-Library.
- Folgende Sonderzeichen wurden verarbeitet:
- "\001" : Positioniere eine Zeile nach oben
- "\002" : Positioniere eine Spalte nach links
- "\033E": Lösche Protokollfenster (CLR-HOME)
- "\034\001": Schalte auf Fett-Schrift
- "\034\010": Schalte Unterstreichung ein
- "\034\011": Fett und Unterstreichung ein
- "\034\100": Auf Normalschrift schalten */
- } print;
- struct {
- void (*printerr) (const char* format, ...);
- /* Wie "printout" (siehe oben). Zusätzlich:
- - Der Text wird "Fett" ausgegeben.
- - Ist das Protokollfenster geschlossen, wird
- eine Alert-Box geöffnet.
- - Ist das Protokollfenster auf "klein" ge-
- schaltet, so wird das Fenster auf "groß"
- geschaltet und in den Vordergrund gebracht
- - Ist das Protokollfenster auf "groß" ge-
- schaltet, so wird das Fenster in den
- Vordergrund gebracht */
- void (*userexit) (void);
- /* Wenn in einem Modul ein fatalen Fehler auf-
- tritt, kann die das Modul sofort verlassen
- werden. Aller angeforderter Speicher wird
- zurückgegeben. Allerdings sind vorher alle
- VDI-Worstations zu schließen und alle
- wind_updates() abzuschießen ...
- Sollte nur im schlimmsten Fall (und nur
- dann) verwendet werden. */
- } error;
- struct {
- byte *(*malloc) (ulong size);
- /* Reserviert "size" Bytes dynamischen Speicher.
- Die Funktion verwaltet selbsttätig kleine
- Speicherblöcke in größeren "Clustern", um
- die Speicherfragmentierunggefahr etwas zu
- veringern. Verwenden Sie nur diese Funktion
- um Speicher dynamisch anzufordern. */
- void (*free) (void *area);
- /* Gibt den reservierten Speicher wieder frei.*/
- } memory;
- struct {
- Image *(*newBitImage) (char *title, unsigned int width, unsigned int height);
- /* Erzeugt und initialisiert eine "Image"-
- Struktur, wobei der Pfadname oder NULL über
- den Parameter "title" übergeben werden kann.
- Für den Datenbreich wird eine Bitplane mit
- alignwidth (auf 16 begradigtes "width") mal
- "height" reserviert.
- In "image->width" wird "width" eingetragen.
- Achten Sie in jedem Fall darauf "image->
- alignTo8" zu setzen. */
- Image *(*newRGBImage) (char *title, unsigned int width, unsigned int height, unsigned int depth);
- /* Erzeugt und initialisiert eine "Image"-
- Struktur, wobei der Pfadname oder NULL über
- den Parameter "title" übergeben werden kann.
- Für den Datenbreich wird eine ein Speicher
- mit alignwidth (auf 16 begradigtes "width")
- mal "height" Bytes reserviert. "depth" ist
- die Zahl der Bitebenen des Bildes für die
- Brechnung der Größe der Farbpalette.
- In "image->width" wird "width" eingetragen.
- Achten Sie in jedem Fall darauf eventuell
- "image->alignTo8" zu setzen. */
- Image *(*newTCImage) (char *title, unsigned int width, unsigned int height);
- /* Erzeugt und initialisiert eine "Image"-
- Struktur, wobei der Pfadname oder NULL über
- den Parameter "title" übergeben werden kann.
- Für den Datenbreich wird eine ein Speicher
- mit alignwidth (auf 16 begradigtes "width")
- mal "height" Tripel (RBG=3 Byte) reserviert.
- In "image->width" wird "width" eingetragen.
- Achten Sie in jedem Fall darauf eventuell
- "image->alignTo8" zu setzen. */
- Image *(*newGEMImage) (char *title, unsigned int width, unsigned int height, unsigned int depth);
- /* Erzeugt und initialisiert eine "Image"-
- Struktur, wobei der Pfadname oder NULL über
- den Parameter "title" übergeben werden kann.
- Für den Datenbreich werden "depth" Bitplanes
- mit alignwidth (auf 16 begradigtes "width")
- mal "height" reserviert. Zur Aufnahme des
- GEM-Standard-Formats. Das Bild ist IMMER
- auf Worte begradigt zu Laden! */
- void (*freeGVImage) (Image *image);
- /* Gibt die reservierten Strukturen wieder frei,
- wenn zum Beispiel des Bild während des Ladens
- als defekt, fehlerhaft oder unvollständig
- erkannt wird. */
- Image *(*rotate) (Image *image, int rotate);
- /* Dreht an Bild um 90, 180 oder 270 Grad, zum
- Beispiel für Photo-CD-Bilder im Hochformat */
- } images;
- struct {
- void (*evntHandle) (int wait);
- /* Läßt GEM-View "wait" Millisekunden Zeit um
- eine Nachricht entgegenzunehmen und sie dann
- abzuarbeiten. Wird nach "wait" Millisekunden
- keine Narchricht empfangen wird die Funktion
- wieder verlassen. Sehr praktisch um GEM-View
- ein paar Redraws und ähnliches machen zu
- lassen. */
- void (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Mausereignis, die Parameter
- ev_mx, ev_my, keystate, keypress entsprechen
- den Werten, die evnt_multi() liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Tastaturereignis, die Para-
- meter keystate, keypress entsprechen den
- Werten, die evnt_multi() liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Mausknopfereignis, die Para-
- meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
- keystate, keypress entsprechen den Werten,
- die evnt_multi() liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Messageereignis, die Para-
- meter msg, ev_mx, ev_my, keystate, keypress
- entsprechen den Werten, die evnt_multi()
- liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
- /* Verarbeitet ein Zeitereignis, die Parameter
- ev_mx, ev_my, keystate, keypress, ev_mbutton
- entsprechen den Werten die evnt_multi()
- liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- */
- int (*alert) (int button, const char *astring);
- /* Die Funktion entspricht exakt form_alert().*/
- } events;
- struct {
- void (*reset_dialogCol) (int flag);
- /* Setzt die Desktopfarben (0 bis 15) wieder
- auf den ursprünglichen Wert zurück, nachdem
- die Bildfarben gesichert wurden (flag = 1).
- Restauriert die Bildfarben wieder, wenn
- "flag" auf 0 gesetzt ist.
- Die Funktion erlaubt einen verschachtelten
- Aufruf und sollte vor und nach jedem Dialog
- aufgerufen werden. Beachten Sie auch die
- Richtlinie von ATARI "Abschließende Worte" */
- void (*send_windOpen) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View an, damit es bei
- der "Cycle Window"-Behandlung mitbehandelt
- wird.
- Das Fenster ist selbst zu öffnen. */
- void (*send_windClosed) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View ab, damit es bei
- der "Cycle Window"-Behandlung nun nicht
- mehr mitarbeitet wird.
- Das Fenster ist selbst zu öffnen. */
- void (*send_windTop) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View als "getopped",
- damit die "Cycle Window"-Behandlung an-
- gepaßt werden kann. */
- void (*send_windBottom) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View als "in-den-Hinter-
- grund-gebracht", damit die "Cycle Window"-
- Behandlung angepaßt werden kann. */
- } diawin;
- struct {
- int applicationID; /* Enthält die appl_id von appl_init() */
- int gemview_vers; /* Enthält die GEM-View Version 0x0300 (3.00) */
- int tos_version; /* Enthält die TOS Versionsnummer z.B. 0x0404 */
- int aes_version; /* Enthält die AES Versionsnummer z.B. 0x0340 */
- int multi_task; /* Enthält den Wert aus GemParBlk.global[1] */
- } versions;
- struct {
- unsigned IMG_fastload : 1;
- unsigned IMG_vdicolororder : 1;
- unsigned IMG_TCalign16 : 1;
- unsigned PCD_loadBase : 3;
- unsigned DSP_usingit : 1;
- unsigned DSP_greyscale : 1;
- unsigned UNUSED : 8;
- unsigned FUTUREUSED : 16;
- long RESERVED;
- } flags;
- } LOAD_Structure;
-
-
-
-
-
- SAVE-Struktur (für die externen Speicher-Module von GEM-View3 *.GVS)
- ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
- Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
- Sie beim Aufruf der Funktionen bitte den Parameterübergabemechanismus von
- Turbo C / Pure C.
-
- typedef struct SAVE_Structure {
- long identify; /* GVWS_module == 'GVWS' */
- int version; /* GVWS_Version == 0x0100 */
- Image *image; /* Zeiger auf "Image", das zu speichern ist. */
- int screen_depth; /* Tiefe (Zahl Planes) der aktuellen Auflösung*/
- char *out_filename; /* Dateiname, in der das Bild gespeichert wird*/
- struct {
- int (*open) (char *file);
- /* Öffnet die angegebene Datei, eine eventuell
- vorhandene Datei wird überschrieben. Rück-
- gabewert ist ein positives Dateihandle.
- Im Fehlerfall wird ein negativer Wert
- zurückgegeben */
- ulong (*write) (int handle, ulong count, void *buf);
- /* Schreibt "count" Bytes aus dem Buffer "buf"
- in die entsprechende Datei. Ein Puffer von
- 8 Kilobyte ist zwischengeschaltet.
- Die Funktion liefert als Ergebnis die Anzahl
- der gespeicherten Bytes zurück oder 0 im
- Fehlerfall */
- int (*close) (int handle);
- /* Speichert gegebenenfalls den "internen"
- Puffer ab und schließt die Datei.
- Die Funktion liefert als Ergebnis eine 0,
- wenn die Datei geschlossen werden konnte,
- ansonsten eine negative Zahl. */
- int (*delete) (const char *fname);
- /* Löscht die die mit fname bezeichnete Datei.
- Die Funktion liefert als Ergebnis eine 0,
- wenn die Datei gelöscht werden konnte, und
- ein von 0 verschiedenes Ergebnis, wenn die
- Datei nicht gelöscht werden konnte. */
- } output;
- struct {
- int (*printout) (const char* format, ...);
- /* Schreibt eine Meldung in das Protokollfenster
- von GEM-View. Die Aufrufstruktur und die
- Parameter entsprechen "printf()" aus der
- C-Standard-Library.
- Folgende Sonderzeichen wurden verarbeitet:
- "\001" : Positioniere eine Zeile nach oben
- "\002" : Positioniere eine Spalte nach links
- "\033E": Lösche Protokollfenster (CLR-HOME)
- "\034\001": Schalte auf Fett-Schrift
- "\034\010": Schalte Unterstreichung ein
- "\034\011": Fett und Unterstreichung ein
- "\034\100": Auf Normalschrift schalten */
- } print;
- struct {
- void (*printerr) (const char* format, ...);
- /* Wie "printout" (siehe oben). Zusätzlich:
- - Der Text wird "Fett" ausgegeben.
- - Ist das Protokollfenster geschlossen, wird
- eine Alert-Box geöffnet.
- - Ist das Protokollfenster auf "klein" ge-
- schaltet, so wird das Fenster auf "groß"
- geschaltet und in den Vordergrund gebracht
- - Ist das Protokollfenster auf "groß" ge-
- schaltet, so wird das Fenster in den
- Vordergrund gebracht */
- void (*userexit) (void);
- /* Wenn in einem Modul ein fatalen Fehler auf-
- tritt, kann die das Modul sofort verlassen
- werden. Aller angeforderter Speicher wird
- zurückgegeben. Allerdings sind vorher alle
- VDI-Worstations zu schließen und alle
- wind_updates() abzuschießen ...
- Sollte nur im schlimmsten Fall (und nur
- dann) verwendet werden. */
- } error;
- struct {
- byte *(*malloc) (ulong size);
- /* Reserviert "size" Bytes dynamischen Speicher.
- Die Funktion verwaltet selbsttätig kleine
- Speicherblöcke in größeren "Clustern", um
- die Speicherfragmentierunggefahr etwas zu
- veringern. Verwenden Sie nur diese Funktion
- um Speicher dynamisch anzufordern. */
- void (*free) (void *area);
- /* Gibt den reservierten Speicher wieder frei.*/
- } memory;
- struct {
- void (*evntHandle) (int wait);
- /* Läßt GEM-View "wait" Millisekunden Zeit um
- eine Nachricht entgegenzunehmen und sie dann
- abzuarbeiten. Wird nach "wait" Millisekunden
- keine Narchricht empfangen wird die Funktion
- wieder verlassen. Sehr praktisch um GEM-View
- ein paar Redraws und ähnliches machen zu
- lassen. */
- void (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Mausereignis, die Parameter
- ev_mx, ev_my, keystate, keypress entsprechen
- den Werten, die evnt_multi() liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Tastaturereignis, die Para-
- meter keystate, keypress entsprechen den
- Werten, die evnt_multi() liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Mausknopfereignis, die Para-
- meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
- keystate, keypress entsprechen den Werten,
- die evnt_multi() liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Messageereignis, die Para-
- meter msg, ev_mx, ev_my, keystate, keypress
- entsprechen den Werten, die evnt_multi()
- liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
- /* Verarbeitet ein Zeitereignis, die Parameter
- ev_mx, ev_my, keystate, keypress, ev_mbutton
- entsprechen den Werten die evnt_multi()
- liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- */
- int (*alert) (int button, const char *astring);
- /* Die Funktion entspricht exakt form_alert().*/
- } events;
- struct {
- void (*reset_dialogCol) (int flag);
- /* Setzt die Desktopfarben (0 bis 15) wieder
- auf den ursprünglichen Wert zurück, nachdem
- die Bildfarben gesichert wurden (flag = 1).
- Restauriert die Bildfarben wieder, wenn
- "flag" auf 0 gesetzt ist.
- Die Funktion erlaubt einen verschachtelten
- Aufruf und sollte vor und nach jedem Dialog
- aufgerufen werden. Beachten Sie auch die
- Richtlinie von ATARI "Abschließende Worte" */
- void (*send_windOpen) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View an, damit es bei
- der "Cycle Window"-Behandlung mitbehandelt
- wird.
- Das Fenster ist selbst zu öffnen. */
- void (*send_windClosed) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View ab, damit es bei
- der "Cycle Window"-Behandlung nun nicht
- mehr mitarbeitet wird.
- Das Fenster ist selbst zu öffnen. */
- void (*send_windTop) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View als "getopped",
- damit die "Cycle Window"-Behandlung an-
- gepaßt werden kann. */
- void (*send_windBottom) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View als "in-den-Hinter-
- grund-gebracht", damit die "Cycle Window"-
- Behandlung angepaßt werden kann. */
- } diawin;
- struct {
- int applicationID; /* Enthält die appl_id von appl_init() */
- int gemview_vers; /* Enthält die GEM-View Version 0x0300 (3.00) */
- int tos_version; /* Enthält die TOS Versionsnummer z.B. 0x0404 */
- int aes_version; /* Enthält die AES Versionsnummer z.B. 0x0340 */
- int multi_task; /* Enthält den Wert aus GemParBlk.global[1] */
- } versions;
- } SAVE_Structure;
-
-
-
-
-
- PRINT-Struktur (für die externen Druck-Module von GEM-View3 *.GVP)
- ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
- Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
- Sie beim Aufruf der Funktionen bitte den Parameterübergabemechanismus von
- Turbo C / Pure C.
-
- typedef struct PRINT_Structure {
- long identify; /* GVWP_module == 'GVWP' */
- int version; /* GVWP_Version == 0x0100 */
- Image *image; /* Zeiger auf "Image", das zu bearbeiten ist. */
- int screen_depth; /* Tiefe (Zahl Planes) der aktuellen Auflösung*/
- struct {
- int (*open) (char *file);
- /* Öffnet die angegebene Datei, eine eventuell
- vorhandene Datei wird überschrieben.
- Für die paralelle Schnittstelle ist "PRN:"
- und für die serielle Schnittstelle ist "AUX:"
- zuverwenden.
- Rückgabewert ist ein positives Dateihandle.
- Im Fehlerfall wird ein negativer Wert
- zurückgegeben */
- ulong (*write) (int handle, ulong count, void *buf);
- /* Schreibt "count" Bytes aus dem Buffer "buf"
- in die entsprechende Datei oder schickt die
- Daten zum Drucker. Ein Puffer von 8 Kilobyte
- ist zwischengeschaltet.
- Die Funktion liefert als Ergebnis die Anzahl
- der gespeicherten Bytes zurück oder 0 im
- Fehlerfall */
- int (*status) (int handle);
- /* Die Funktion überprüft, ob die Drucker-
- schnittstelle bereit ist, Zeichen anzunehmen.
- Die Funktion liefert als Ergebnis den
- Drucker-Status.
- Wenn der Drucker bereit ist, wird ein Wert
- ungleich 0 zurückgegeben, ansonsten eine 0.*/
- int (*close) (int handle);
- /* Speichert bzw. druckt gegebenenfalls den
- Puffer ab und schließt die "Datei".
- Die Funktion liefert als Ergebnis eine 0,
- wenn die Datei geschlossen werden konnte,
- ansonsten eine negative Zahl. */
- } output;
- struct {
- int (*printout) (const char* format, ...);
- /* Schreibt eine Meldung in das Protokollfenster
- von GEM-View. Die Aufrufstruktur und die
- Parameter entsprechen "printf()" aus der
- C-Standard-Library.
- Folgende Sonderzeichen wurden verarbeitet:
- "\001" : Positioniere eine Zeile nach oben
- "\002" : Positioniere eine Spalte nach links
- "\033E": Lösche Protokollfenster (CLR-HOME)
- "\034\001": Schalte auf Fett-Schrift
- "\034\010": Schalte Unterstreichung ein
- "\034\011": Fett und Unterstreichung ein
- "\034\100": Auf Normalschrift schalten */
- } print;
- struct {
- void (*printerr) (const char* format, ...);
- /* Wie "printout" (siehe oben). Zusätzlich:
- - Der Text wird "Fett" ausgegeben.
- - Ist das Protokollfenster geschlossen, wird
- eine Alert-Box geöffnet.
- - Ist das Protokollfenster auf "klein" ge-
- schaltet, so wird das Fenster auf "groß"
- geschaltet und in den Vordergrund gebracht
- - Ist das Protokollfenster auf "groß" ge-
- schaltet, so wird das Fenster in den
- Vordergrund gebracht */
- void (*userexit) (void);
- /* Wenn in einem Modul ein fatalen Fehler auf-
- tritt, kann die das Modul sofort verlassen
- werden. Aller angeforderter Speicher wird
- zurückgegeben. Allerdings sind vorher alle
- VDI-Worstations zu schließen und alle
- wind_updates() abzuschießen ...
- Sollte nur im schlimmsten Fall (und nur
- dann) verwendet werden. */
- } error;
- struct {
- byte *(*malloc) (ulong size);
- /* Reserviert "size" Bytes dynamischen Speicher.
- Die Funktion verwaltet selbsttätig kleine
- Speicherblöcke in größeren "Clustern", um
- die Speicherfragmentierunggefahr etwas zu
- veringern. Verwenden Sie nur diese Funktion
- um Speicher dynamisch anzufordern. */
- void (*free) (void *area);
- /* Gibt den reservierten Speicher wieder frei.*/
- } memory;
- struct {
- void (*evntHandle) (int wait);
- /* Läßt GEM-View "wait" Millisekunden Zeit um
- eine Nachricht entgegenzunehmen und sie dann
- abzuarbeiten. Wird nach "wait" Millisekunden
- keine Narchricht empfangen wird die Funktion
- wieder verlassen. Sehr praktisch um GEM-View
- ein paar Redraws und ähnliches machen zu
- lassen. */
- void (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Mausereignis, die Parameter
- ev_mx, ev_my, keystate, keypress entsprechen
- den Werten, die evnt_multi() liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Tastaturereignis, die Para-
- meter keystate, keypress entsprechen den
- Werten, die evnt_multi() liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Mausknopfereignis, die Para-
- meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
- keystate, keypress entsprechen den Werten,
- die evnt_multi() liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Messageereignis, die Para-
- meter msg, ev_mx, ev_my, keystate, keypress
- entsprechen den Werten, die evnt_multi()
- liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
- /* Verarbeitet ein Zeitereignis, die Parameter
- ev_mx, ev_my, keystate, keypress, ev_mbutton
- entsprechen den Werten die evnt_multi()
- liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- */
- int (*alert) (int button, const char *astring);
- /* Die Funktion entspricht exakt form_alert().*/
- } events;
- struct {
- void (*reset_dialogCol) (int flag);
- /* Setzt die Desktopfarben (0 bis 15) wieder
- auf den ursprünglichen Wert zurück, nachdem
- die Bildfarben gesichert wurden (flag = 1).
- Restauriert die Bildfarben wieder, wenn
- "flag" auf 0 gesetzt ist.
- Die Funktion erlaubt einen verschachtelten
- Aufruf und sollte vor und nach jedem Dialog
- aufgerufen werden. Beachten Sie auch die
- Richtlinie von ATARI "Abschließende Worte" */
- void (*send_windOpen) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View an, damit es bei
- der "Cycle Window"-Behandlung mitbehandelt
- wird.
- Das Fenster ist selbst zu öffnen. */
- void (*send_windClosed) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View ab, damit es bei
- der "Cycle Window"-Behandlung nun nicht
- mehr mitarbeitet wird.
- Das Fenster ist selbst zu öffnen. */
- void (*send_windTop) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View als "getopped",
- damit die "Cycle Window"-Behandlung an-
- gepaßt werden kann. */
- void (*send_windBottom) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View als "in-den-Hinter-
- grund-gebracht", damit die "Cycle Window"-
- Behandlung angepaßt werden kann. */
- } diawin;
- struct {
- int applicationID; /* Enthält die appl_id von appl_init() */
- int gemview_vers; /* Enthält die GEM-View Version 0x0300 (3.00) */
- int tos_version; /* Enthält die TOS Versionsnummer z.B. 0x0404 */
- int aes_version; /* Enthält die AES Versionsnummer z.B. 0x0340 */
- int multi_task; /* Enthält den Wert aus GemParBlk.global[1] */
- } versions;
- } PRINT_Structure;
-
-
-
-
-
- PROC-Struktur (für die externen Bearbeitungs-Module von GEM-View3 *.GVR)
- ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
- Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
- Sie beim Aufruf der Funktionen bitte den Parameterübergabemechanismus von
- Turbo C / Pure C.
-
- typedef struct PROC_Structure {
- long identify; /* GVWR_module == 'GVWR' */
- int version; /* GVWR_Version == 0x0100 */
- Image *image; /* Zeiger auf "Image",das gedruckt werden soll*/
- int screen_depth; /* Tiefe (Zahl Planes) der aktuellen Auflösung*/
- struct {
- int (*printout) (const char* format, ...);
- /* Schreibt eine Meldung in das Protokollfenster
- von GEM-View. Die Aufrufstruktur und die
- Parameter entsprechen "printf()" aus der
- C-Standard-Library.
- Folgende Sonderzeichen wurden verarbeitet:
- "\001" : Positioniere eine Zeile nach oben
- "\002" : Positioniere eine Spalte nach links
- "\033E": Lösche Protokollfenster (CLR-HOME)
- "\034\001": Schalte auf Fett-Schrift
- "\034\010": Schalte Unterstreichung ein
- "\034\011": Fett und Unterstreichung ein
- "\034\100": Auf Normalschrift schalten */
- } print;
- struct {
- void (*printerr) (const char* format, ...);
- /* Wie "printout" (siehe oben). Zusätzlich:
- - Der Text wird "Fett" ausgegeben.
- - Ist das Protokollfenster geschlossen, wird
- eine Alert-Box geöffnet.
- - Ist das Protokollfenster auf "klein" ge-
- schaltet, so wird das Fenster auf "groß"
- geschaltet und in den Vordergrund gebracht
- - Ist das Protokollfenster auf "groß" ge-
- schaltet, so wird das Fenster in den
- Vordergrund gebracht */
- void (*userexit) (void);
- /* Wenn in einem Modul ein fatalen Fehler auf-
- tritt, kann die das Modul sofort verlassen
- werden. Aller angeforderter Speicher wird
- zurückgegeben. Allerdings sind vorher alle
- VDI-Worstations zu schließen und alle
- wind_updates() abzuschießen ...
- Sollte nur im schlimmsten Fall (und nur
- dann) verwendet werden. */
- } error;
- struct {
- byte *(*malloc) (ulong size);
- /* Reserviert "size" Bytes dynamischen Speicher.
- Die Funktion verwaltet selbsttätig kleine
- Speicherblöcke in größeren "Clustern", um
- die Speicherfragmentierunggefahr etwas zu
- veringern. Verwenden Sie nur diese Funktion
- um Speicher dynamisch anzufordern. */
- void (*free) (void *area);
- /* Gibt den reservierten Speicher wieder frei.*/
- } memory;
- struct {
- Image *(*newBitImage) (char *title, unsigned int width, unsigned int height);
- /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
- Erzeugt und initialisiert eine "Image"-
- Struktur, wobei der Pfadname oder NULL über
- den Parameter "title" übergeben werden kann.
- Für den Datenbreich wird eine Bitplane mit
- alignwidth (auf 16 begradigtes "width") mal
- "height" reserviert.
- In "image->unalignwidth" wird "width" ein-
- getragen. "alignwidth" wird in "->width"
- eingetragen.
- Das Bild ist IMMER auf Worte begradigt auf-
- gebaut und ist auch so wieder aufzubauen. */
- Image *(*newRGBImage) (char *title, unsigned int width, unsigned int height, unsigned int depth);
- /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
- Erzeugt und initialisiert eine "Image"-
- Struktur, wobei der Pfadname oder NULL über
- den Parameter "title" übergeben werden kann.
- Für den Datenbreich werden "depth" Bitplanes
- mit alignwidth (auf 16 begradigtes "width")
- mal "height" reserviert. Zur Aufnahme des
- GEM-Standard-Formats.
- In "image->unalignwidth" wird "width" ein-
- getragen. "alignwidth" wird in "->width"
- eingetragen.
- Das Bild ist IMMER auf Worte begradigt auf-
- gebaut und ist auch so wieder aufzubauen. */
- Image *(*newTCImage) (char *title, unsigned int width, unsigned int height);
- /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
- Erzeugt und initialisiert eine "Image"-
- Struktur, wobei der Pfadname oder NULL über
- den Parameter "title" übergeben werden kann.
- Für den Datenbreich werden alignwidth (auf
- 16 begradigtes "width") mal "height" viele
- RGB-Tripel reserviert.
- In "image->unalignwidth" wird "width" ein-
- getragen. "alignwidth" wird in "->width"
- eingetragen.
- Das Bild ist IMMER auf Worte begradigt auf-
- gebaut und ist auch so wieder aufzubauen. */
- Image *(*newGEMImage) (char *title, unsigned int width, unsigned int height, unsigned int depth);
- /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
- Erzeugt und initialisiert eine "Image"-
- Struktur, wobei der Pfadname oder NULL über
- den Parameter "title" übergeben werden kann.
- Für den Datenbreich werden "depth" Bitplanes
- mit alignwidth (auf 16 begradigtes "width")
- mal "height" reserviert. Zur Aufnahme des
- GEM-Standard-Formats.
- In "image->unalignwidth" wird "width" ein-
- getragen. "alignwidth" wird in "->width"
- eingetragen.
- Das Bild ist IMMER auf Worte begradigt auf-
- gebaut und ist auch so wieder aufzubauen. */
- void (*freeGVImage) (Image *image);
- /* !!!!!!!!!!!!!!!!! ACHTUNG !!!!!!!!!!!!!!!!!
- Gibt die reservierten Strukturen wieder frei,
- wenn zum Beispiel während der Umwandlung
- etwas unvorhergesehenes passiert.
- Das Bild, welches dem Bearbeitungsmodul
- übergeben wird von GEM-View aus dem Speicher
- entfernt und darf nicht vom Modul gelöscht
- werden. */
- } images;
- struct {
- void (*evntHandle) (int wait);
- /* Läßt GEM-View "wait" Millisekunden Zeit um
- eine Nachricht entgegenzunehmen und sie dann
- abzuarbeiten. Wird nach "wait" Millisekunden
- keine Narchricht empfangen wird die Funktion
- wieder verlassen. Sehr praktisch um GEM-View
- ein paar Redraws und ähnliches machen zu
- lassen. */
- void (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Mausereignis, die Parameter
- ev_mx, ev_my, keystate, keypress entsprechen
- den Werten, die evnt_multi() liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Tastaturereignis, die Para-
- meter keystate, keypress entsprechen den
- Werten, die evnt_multi() liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Mausknopfereignis, die Para-
- meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
- keystate, keypress entsprechen den Werten,
- die evnt_multi() liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Messageereignis, die Para-
- meter msg, ev_mx, ev_my, keystate, keypress
- entsprechen den Werten, die evnt_multi()
- liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
- /* Verarbeitet ein Zeitereignis, die Parameter
- ev_mx, ev_my, keystate, keypress, ev_mbutton
- entsprechen den Werten die evnt_multi()
- liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- */
- int (*alert) (int button, const char *astring);
- /* Die Funktion entspricht exakt form_alert().*/
- } events;
- struct {
- void (*reset_dialogCol) (int flag);
- /* Setzt die Desktopfarben (0 bis 15) wieder
- auf den ursprünglichen Wert zurück, nachdem
- die Bildfarben gesichert wurden (flag = 1).
- Restauriert die Bildfarben wieder, wenn
- "flag" auf 0 gesetzt ist.
- Die Funktion erlaubt einen verschachtelten
- Aufruf und sollte vor und nach jedem Dialog
- aufgerufen werden. Beachten Sie auch die
- Richtlinie von ATARI "Abschließende Worte" */
- void (*send_windOpen) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View an, damit es bei
- der "Cycle Window"-Behandlung mitbehandelt
- wird.
- Das Fenster ist selbst zu öffnen. */
- void (*send_windClosed) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View ab, damit es bei
- der "Cycle Window"-Behandlung nun nicht
- mehr mitarbeitet wird.
- Das Fenster ist selbst zu öffnen. */
- void (*send_windTop) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View als "getopped",
- damit die "Cycle Window"-Behandlung an-
- gepaßt werden kann. */
- void (*send_windBottom) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View als "in-den-Hinter-
- grund-gebracht", damit die "Cycle Window"-
- Behandlung angepaßt werden kann. */
- } diawin;
- struct {
- int applicationID; /* Enthält die appl_id von appl_init() */
- int gemview_vers; /* Enthält die GEM-View Version 0x0300 (3.00) */
- int tos_version; /* Enthält die TOS Versionsnummer z.B. 0x0404 */
- int aes_version; /* Enthält die AES Versionsnummer z.B. 0x0340 */
- int multi_task; /* Enthält den Wert aus GemParBlk.global[1] */
- } versions;
- } PROC_Structure;
-
-
-
-
-
- CONV-Struktur (für das externe Konvertierungs-Module von GEM-View3)
- ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
- Sollten Sie eine anderen Compiler als Turbo C / Pure C verwenden, beachten
- Sie beim Aufruf der Funktionen bitte den Parameterübergabemechanismus von
- Turbo C / Pure C.
-
- typedef struct CONV_Structure {
- long identify; /* GVWC_module == 'GVWC' */
- int version; /* GVWC_Version == 0x0100 */
- int screen_depth; /* Tiefe (Zahl Planes) der aktuellen Auflösung*/
- struct {
- byte *(*malloc) (ulong size);
- /* Reserviert "size" Bytes dynamischen Speicher.
- Die Funktion verwaltet selbsttätig kleine
- Speicherblöcke in größeren "Clustern", um
- die Speicherfragmentierunggefahr etwas zu
- veringern. Verwenden Sie nur diese Funktion
- um Speicher dynamisch anzufordern. */
- void (*free) (void *area);
- /* Gibt den reservierten Speicher wieder frei.*/
- } memory;
- struct {
- void (*evntHandle) (int wait);
- /* Läßt GEM-View "wait" Millisekunden Zeit um
- eine Nachricht entgegenzunehmen und sie dann
- abzuarbeiten. Wird nach "wait" Millisekunden
- keine Narchricht empfangen wird die Funktion
- wieder verlassen. Sehr praktisch um GEM-View
- ein paar Redraws und ähnliches machen zu
- lassen. */
- void (*evntHandleMouse) (int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Mausereignis, die Parameter
- ev_mx, ev_my, keystate, keypress entsprechen
- den Werten, die evnt_multi() liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleKeybd) (int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Tastaturereignis, die Para-
- meter keystate, keypress entsprechen den
- Werten, die evnt_multi() liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleButton)(int ev_mx, int ev_my, int ev_mbutton, int ev_mbreturn, int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Mausknopfereignis, die Para-
- meter ev_mx, ev_my, ev_mbutton, ev_mbreturn,
- keystate, keypress entsprechen den Werten,
- die evnt_multi() liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleMesag) (int* msg, int ev_mx, int ev_my, int keystate, int keypress, int gvwInAction, int* exit);
- /* Verarbeitet ein Messageereignis, die Para-
- meter msg, ev_mx, ev_my, keystate, keypress
- entsprechen den Werten, die evnt_multi()
- liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- void (*evntHandleTimer) (int ev_mx, int ev_my, int keystate, int keypress, int ev_mbutton, int gvwInAction, int* exit);
- /* Verarbeitet ein Zeitereignis, die Parameter
- ev_mx, ev_my, keystate, keypress, ev_mbutton
- entsprechen den Werten die evnt_multi()
- liefert.
- gvwInAction ist immer auf TRUE (1) zu setzen
- In exit wird ein Wert ungleich 0 zurückge-
- geben, wenn das Modul seine Arbeit abbrechen
- soll. Dieses sollte so schnell wie möglich
- geschehen! */
- */
- int (*alert) (int button, const char *astring);
- /* Die Funktion entspricht exakt form_alert().*/
- } events;
- struct {
- void (*reset_dialogCol) (int flag);
- /* Setzt die Desktopfarben (0 bis 15) wieder
- auf den ursprünglichen Wert zurück, nachdem
- die Bildfarben gesichert wurden (flag = 1).
- Restauriert die Bildfarben wieder, wenn
- "flag" auf 0 gesetzt ist.
- Die Funktion erlaubt einen verschachtelten
- Aufruf und sollte vor und nach jedem Dialog
- aufgerufen werden. Beachten Sie auch die
- Richtlinie von ATARI "Abschließende Worte" */
- void (*send_windOpen) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View an, damit es bei
- der "Cycle Window"-Behandlung mitbehandelt
- wird.
- Das Fenster ist selbst zu öffnen. */
- void (*send_windClosed) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View ab, damit es bei
- der "Cycle Window"-Behandlung nun nicht
- mehr mitarbeitet wird.
- Das Fenster ist selbst zu öffnen. */
- void (*send_windTop) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View als "getopped",
- damit die "Cycle Window"-Behandlung an-
- gepaßt werden kann. */
- void (*send_windBottom) (int wind_id);
- /* Meldet das Fenster mit der Identifikation
- "wind_id" bei GEM-View als "in-den-Hinter-
- grund-gebracht", damit die "Cycle Window"-
- Behandlung angepaßt werden kann. */
- int (*getMSaving) (char *title, char *extention, char *name, char *filename);
- /* Führt einen Benutzerdialog zur Auswahl eines
- monochromen Speicherformats.
- Der Text "title" wird im Dialog eingetragen.
- In "extention" wird die übliche Dateiendung
- (6 Bytes), in "name" der Name des Formates
- (18 Bytes) und in "filename" der Modulname
- (14 Bytes) zurückgebenen. Als Funktionswert
- erhält man einen Wert ungleich 0, wenn die
- Werte gültig sind, ansonsten 0. */
- int (*getCSaving) (char *title, char *extention, char *name, char *filename);
- /* Führt einen Benutzerdialog zur Auswahl eines
- farbigen Speicherformats.
- Der Text "title" wird im Dialog eingetragen.
- In "extention" wird die übliche Dateiendung
- (6 Bytes), in "name" der Name des Formates
- (18 Bytes) und in "filename" der Modulname
- (14 Bytes) zurückgebenen. Als Funktionswert
- erhält man einen Wert ungleich 0, wenn die
- Werte gültig sind, ansonsten 0. */
- int (*getTSaving) (char *title, char *extention, char *name, char *filename);
- /* Führt einen Benutzerdialog zur Auswahl eines
- True-Color Speicherformats.
- Der Text "title" wird im Dialog eingetragen.
- In "extention" wird die übliche Dateiendung
- (6 Bytes), in "name" der Name des Formates
- (18 Bytes) und in "filename" der Modulname
- (14 Bytes) zurückgebenen. Als Funktionswert
- erhält man einen Wert ungleich 0, wenn die
- Werte gültig sind, ansonsten 0. */
- } diawin;
- struct {
- int applicationID; /* Enthält die appl_id von appl_init() */
- int gemview_vers; /* Enthält die GEM-View Version 0x0300 (3.00) */
- int tos_version; /* Enthält die TOS Versionsnummer z.B. 0x0404 */
- int aes_version; /* Enthält die AES Versionsnummer z.B. 0x0340 */
- int multi_task; /* Enthält den Wert aus GemParBlk.global[1] */
- } versions;
- } CONV_Structure;
-
-
-
-
-
- Entwickler-Support
- """"""""""""""""""
- Bei Fragen zur Modulprogrammierung kann ich am Samstags zwischen
- 14:00 und 16:00 Uhr angerufen werden.
- Dies gilt ausschließlich für Fragen zur Modulprogrammierung, quasi
- ein Entwickler-Support ;-)
-